package com.qianfeng.gl4study.youshare.view;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.GridView;

/**
 * 继承GridView，实现在ScrollView中能够完整显示的GridView。
 *  通常并不推荐在ScrollView中防GridView和ListView，若必须放，就采用自定义的方式。
 *  但自定义的GridView和ListView的优化可能会失效。
 *
 *  注意的点：
 *      1，构造方法
 *      2，使用文件，在xml文件中引用
 *
 * Created with IntelliJ IDEA.
 * I'm glad to share my knowledge with you all.
 * User:Gaolei
 * Date:2015/2/7
 * Email:pdsfgl@live.com
 */
public class FullGridView extends GridView {

	/**
	 * 1，自定义View构造方法,
	 * 该方法只能在代码中创建View
	 */
	public FullGridView(Context context){
		super(context);

	}

	/**
	 * 若自定义View需要放到layout的xml文件中，必须提供该构造方法
	 * @param context
	 * @param attrs
	 */
	public  FullGridView(Context context,AttributeSet attrs){
		super(context, attrs);
	}

	/**
	 * 在ScrollView使用GridView，需要重写onMeasure方法
	 * 本方法通常在父容器Layout计算尺寸的时候项子控件或容器询问子控件的大小。
	 * 子控件就计算一下自己的大小，然后返回给父容器。
	 * 子控件使用回调的方法计算自己的大小，回调方法就是：onMeasure，在方法内部设置自身的尺寸。
	 * @param widthMeasureSpec  宽度的尺寸规格，包含父容器给控件的最大宽度（不是具体的数值）
	 * @param heightMeasureSpec 高度尺寸规格，包含了父容器允许控件最大的高度，也可以wrap_content或者具体数值
	 */
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

		/*
		获取父容器给当前控件提供的最大的空间，或是在layout中指定的尺寸，实际获取的数值单位是像素，
		如果指定布局使用dp，则返回结果可能与指定不同，屏幕适配造成的
		*/
		int widthSize = MeasureSpec.getSize(widthMeasureSpec);//获取宽度规格中的数值,
		int heightSize = MeasureSpec.getSize(heightMeasureSpec);//获取高度规格中的数值
		int hMode = MeasureSpec.getMode(heightMeasureSpec);

		/*
		mode代表尺寸计算的方法。onMeasure提供了mode计算的方式。
		若将heightSize指定一个很大的值，并且将尺寸计算模式调整为AT_MOST（wrap_content）则能完全显示
		 */
		switch (hMode){
			case MeasureSpec.AT_MOST:   //wrap_content
				Log.d("YouShare","FullGridView Mode:AT_MOST");
				break;
			case MeasureSpec.EXACTLY:   //math_parent
				Log.d("YouShare","FullGridView Mode:EXACTLY");
				break;
			case MeasureSpec.UNSPECIFIED://不限定尺寸的大小
				Log.d("YouShare","FullGridView Mode:UNSPECIFIED");
				break;
		}
		heightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>1,MeasureSpec.AT_MOST);

		Log.d("YouShare","FullGridView widthSize:"+widthSize +" heightSize:"+heightSize);

		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
	}
}
